import axios from "axios";
import store from "../store";
import storage from "store";
import notification from "ant-design-vue/es/notification";
import { ACCESS_TOKEN } from "../store/mutation-types";

// 创建 axios 实例
const request = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL, // API 请求的默认前缀
  timeout: 60000 // 请求超时时间
});

// 异常拦截处理器
const errorHandler = error => {
  console.log(error);
  if (error.response) {
    const data = error.response.data;
    // 从 localstorage 获取 token
    const token = storage.get(ACCESS_TOKEN);
    if (error.response.status === 403) {
      notification.error({
        message: "Forbidden",
        description: data.message
      });
    }
    if (
      error.response.status === 401 &&
      !(data.result && data.result.isLogin)
    ) {
      // notification.error({
      //   message: '未经授权',
      //   description: '授权验证已过期，请重新登录，谢谢'
      // })
      if (token) {
        alert("授权验证已过期，请重新登录，谢谢");
        store.dispatch("Logout").then(() => {
          window.location.reload();
          // notification.error({
          //   message: '未经授权',
          //   description: '授权验证已过期，请重新登录，谢谢'
          // })
          // setTimeout(() => {
          //   window.location.reload()
          // }, 3000)
        });
      }
    }
  }
  return Promise.reject(error);
};

// 添加请求拦截器
request.interceptors.request.use(config => {
  // 在发送请求之前做些什么
  const token = storage.get(ACCESS_TOKEN);
  // 如果token存在，让每个请求携带token
  if (token) {
    // 让每个请求携带自定义token
    config.headers["Authorization"] = token;
  }
  return config;
  // 对请求错误做些什么
}, errorHandler);

// 添加响应拦截器
request.interceptors.response.use(response => {
  console.log(response);
  // 对响应数据做点什么
  const res = response.data;
  // response.headers.authorization => token
  // console.log(response.headers.authorization)  这里能拿到响应头
  if (res) {
    if (response.request.responseType !== "blob") {
      if (res.code && `${res.code}` !== "200") {
        notification.error({
          message: res.message,
          description: "请重试",
          duration: 2.5
        });
        return Promise.reject(new Error(res.message || "Error"));
      } else {
        return response;
      }
    } else {
      return response;
    }
  } else {
    return Promise.reject(new Error(res.message || "Error"));
  }
  // 对响应错误做点什么
}, errorHandler);

export default request;
